/**
 * Vite 配置
 * https://vitejs.dev/config/
 */
import { defineConfig, loadEnv } from "vite"
import vue from "@vitejs/plugin-vue"
import { fileURLToPath, URL } from "node:url"

export default defineConfig(({ mode }) => {
  // 加载环境变量
  const env = loadEnv(mode, process.cwd(), "")
  const isProduction = mode === "production"

  return {
    plugins: [vue()],

    // 路径别名
    resolve: {
      alias: {
        "@": fileURLToPath(new URL("./src", import.meta.url))
      }
    },

    // CSS 配置
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: `@use "@/styles/base/variables" as *;`,
          charset: false
        }
      },
      devSourcemap: !isProduction // 开发环境启用 CSS source map
    },

    // 开发服务器配置
    server: {
      host: "0.0.0.0", // 允许外部访问
      port: 5173,
      open: false, // 不自动打开浏览器
      cors: true, // 允许跨域
      strictPort: false, // 端口被占用时自动尝试下一个
      proxy: {
        "/api": {
          target: env.VITE_API_BASE_URL || "http://127.0.0.1:8080",
          changeOrigin: true,
          rewrite: path => path.replace(/^\/api/, "")
        }
      }
    },

    // 构建配置
    build: {
      // 输出目录
      outDir: "dist",
      assetsDir: "assets",

      // 代码压缩
      minify: "terser",
      terserOptions: {
        compress: {
          drop_console: isProduction, // 生产环境移除 console
          drop_debugger: isProduction, // 生产环境移除 debugger
          pure_funcs: isProduction ? ["console.log", "console.info", "console.debug"] : []
        }
      },

      // 资源处理
      assetsInlineLimit: 4096, // 小于 4KB 的资源内联为 base64
      chunkSizeWarningLimit: 1000, // chunk 大小警告阈值（KB）

      // Source Map
      sourcemap: !isProduction, // 仅开发环境生成 source map

      // CSS 代码分割
      cssCodeSplit: true,

      // 构建目标
      target: "es2015",

      // 清空输出目录
      emptyOutDir: true,

      // Rollup 配置
      rollupOptions: {
        output: {
          // 代码分割策略
          manualChunks: id => {
            // Vue 核心
            if (id.includes("node_modules/vue/") || id.includes("node_modules/@vue/")) {
              return "vue-core"
            }
            // Vue 生态
            if (id.includes("node_modules/vue-router") || id.includes("node_modules/pinia")) {
              return "vue-ecosystem"
            }
            // Element Plus 核心
            if (id.includes("node_modules/element-plus")) {
              return "element-plus"
            }
            // Element Plus 图标
            if (id.includes("node_modules/@element-plus/icons-vue")) {
              return "element-icons"
            }
            // CodeMirror 编辑器
            if (id.includes("node_modules/codemirror") || id.includes("node_modules/@codemirror")) {
              return "codemirror"
            }
            // Markdown 编辑器
            if (id.includes("node_modules/md-editor-v3")) {
              return "md-editor"
            }
            // HTTP 库
            if (id.includes("node_modules/axios")) {
              return "axios"
            }
            // 日期库
            if (id.includes("node_modules/dayjs")) {
              return "dayjs"
            }
            // 工具库
            if (id.includes("node_modules/lodash")) {
              return "lodash"
            }
            // 其他第三方库
            if (id.includes("node_modules/")) {
              return "vendor"
            }
          },

          // 文件命名
          chunkFileNames: "js/[name]-[hash].js",
          entryFileNames: "js/[name]-[hash].js",
          assetFileNames: assetInfo => {
            const name = assetInfo.name || ""
            // 图片
            if (/\.(png|jpe?g|gif|svg|webp|ico|bmp)$/i.test(name)) {
              return "images/[name]-[hash][extname]"
            }
            // 字体
            if (/\.(woff2?|eot|ttf|otf)$/i.test(name)) {
              return "fonts/[name]-[hash][extname]"
            }
            // CSS
            if (/\.css$/i.test(name)) {
              return "css/[name]-[hash][extname]"
            }
            // 其他资源
            return "assets/[name]-[hash][extname]"
          }
        }
      }
    },

    // 依赖预构建优化
    optimizeDeps: {
      include: [
        "vue",
        "vue-router",
        "pinia",
        "pinia-plugin-persistedstate",
        "element-plus",
        "@element-plus/icons-vue",
        "axios",
        "dayjs"
      ],
      exclude: [
        "codemirror", // 大型库排除预构建
        "md-editor-v3"
      ]
    },

    // 预览服务器配置（用于预览生产构建）
    preview: {
      host: "0.0.0.0",
      port: 4173,
      strictPort: false,
      open: false
    }
  }
})
